package com.anuo.app.study.studyjava;


import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

/*
Java IO
研究状态: 常用已完成
@ 创建文件并写入字符串
@ 从文件读取字符串
@ 增删目录,文件
@ 复制文件
*/
public class StudyIO {
    public static void main(String[] args) {
        try {
            List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

            for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
                System.out.println(gcMxBean.getName());
                System.out.println(gcMxBean.getObjectName());
            }

        } catch (RuntimeException re) {
            throw re;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

    public final static String FILE_PATH="src/files/anuo.txt";
//    public static void main(String[] args) {
//        try {
//            copyFile();
//            //directoryOperate();
//            //readTextFileToString();
//            //createTextFileWithString();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }

    //创建文件并写入字符串(一般用第一种)
    public static void createTextFileWithString() throws Exception {
        //1. 创建一个文本文件 java 7- 参考: http://stackoverflow.com/questions/2885173/how-do-i-create-a-file-and-write-to-it-in-java
        PrintWriter writer = new PrintWriter(FILE_PATH, "UTF-8");//默认路径是项目根目录,如果文件存在会被重写
        writer.println("hello");
        writer.println("world");
        writer.close();
        //2. 创建一个文本文件 java 7+
/*
        List<String> lines = Arrays.asList("The first line", "The second line");
        Path file = Paths.get("the-file-name.txt");
        Files.write(file, lines, Charset.forName("UTF-8"));
        Files.write(file, lines, Charset.forName("UTF-8"), StandardOpenOption.APPEND);
*/

    }
    //从文件读取字符串
    public static void readTextFileToString() throws Exception {
        //读取一个文件中的字符串
        FileInputStream inputStream = new FileInputStream(FILE_PATH);
        try {
            String str= IOUtils.toString(inputStream);
            System.out.println(str);
        }finally {
            if (inputStream!=null){
                inputStream.close();
            }
        }

    }

    //读写文件,较官方的写法(复杂不建议用)
    public static void offical() throws  Exception{
        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建

        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk

        writer.append("中文输入");
        // 写入到缓冲区

        writer.append("\r\n");
        //换行

        writer.append("English");
        // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入

        writer.close();
        //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉

        fop.close();
        // 关闭输出流,释放系统资源

        FileInputStream fip = new FileInputStream(f);
        // 构建FileInputStream对象

        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 构建InputStreamReader对象,编码与写入相同

        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 转成char加到StringBuffer对象中
        }
        System.out.println(sb.toString());
        reader.close();
        // 关闭读取流

        fip.close();
        // 关闭输入流,释放系统资源
    }

    //目录创建和删除, 文件删除
    public static void directoryOperate() throws IOException {
        //创建目录
        String dirPath="/tmp/user/java/bin";
        File file= new File(dirPath);
        file.mkdir();//创建 bin 目录, 如果中间的目录没得就创建失败
        file.mkdirs();//创建所有目录 , 如果没有
        //删除目录
        FileUtils.deleteDirectory(new File(dirPath));

        //文件删除
        file.delete();
    }

    //复制文件
    public static void copyFile() throws IOException {
        //复制文件到某个目录
        File destDir = new File("C:\\Users\\Anuo\\Desktop\\AnuoApc");
        File srcFile = new File(FILE_PATH);
        FileUtils.copyFileToDirectory(srcFile, destDir);
    }
}

